package com.lhd.utils;

import java.util.concurrent.LinkedBlockingDeque;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

public class ThreadPoolUtil {

    //线程池的核心实现类    线程池对象
    private static ThreadPoolExecutor threadPoolExecutor;

    private ThreadPoolUtil() {
    }

    public static ThreadPoolExecutor getThreadPoolExecutor() {

        if (threadPoolExecutor == null) {
            //单例线程安全
            synchronized (ThreadPoolUtil.class) {
                if (threadPoolExecutor == null) {
  /*
1.核心线程4
   生产环境中  我们的访问redis   1毫秒redis  秒处理1000条数据    高峰期速度1秒 1万  压测处理2万
   比如：kafka分区是四个  那么对应的就是4个并行度   一个并行度每秒处理1000       那么我们设置核心线程就是5-6
2.
① corePoolSize
线程池中的核心线程数，默认情况下核心线程一直存活在线程池中，如果将 ThreadPoolExecutor 的 allowCoreThreadTimeOut 属性设为 true，如果线程池一直闲置并超过了 keepAliveTime 所指定的时间，核心线程就会被终止。
② maximumPoolSize
线程池中最大线程数，如果活动的线程达到这个数值以后，后续的新任务将会被阻塞（放入任务队列）。
③ keepAliveTime
线程池的闲置超时时间，默认情况下对非核心线程生效，如果闲置时间超过这个时间，非核心线程就会被回收。如果 ThreadPoolExecutor 的 allowCoreThreadTimeOut 设为 true 的时候，核心线程如果超过闲置时长也会被回收。
④ unit
配合 keepAliveTime 使用，用来标识 keepAliveTime 的时间单位。
⑤ workQueue
线程池中的任务队列，使用 execute() 或 submit() 方法提交的任务都会存储在此队列中。
⑥ threadFactory
为线程池提供创建新线程的线程工厂。
                    * */
                    threadPoolExecutor = new ThreadPoolExecutor(4,
                            20,
                            100,
                            TimeUnit.SECONDS,
                            new LinkedBlockingDeque<>());
                }
            }
        }

        return threadPoolExecutor;
    }
}
